home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Netware Super Library
/
Netware Super Library.iso
/
pgm_tool
/
lu62
/
rmfmh5.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-07-03
|
5KB
|
194 lines
/********************************************************
* *
* RMFMH5 *
* processing the FMH-5 by RM *
* *
* INPUT : "fmhcom" record from PS. *
* *
* OUTPUT: the "cma" record to PS. *
* *
* CopyRight 1995. Nicholas Poljakov all rights reserved.*
********************************************************/
#include <state1.h>
#include <fmhcom.h>
#include <tcb.h>
#include <rcb.h>
#include <scb.h>
#include <fmh5.h>
#include <lucb.h>
#include <arcb.h>
#include <rcballoc.h>
#include <partner.h>
#include <mode.h>
#include <psp.h>
#include <rpl.h>
#include <memory.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>
extern struct psp psp_ini;
unsigned long attacheck(void *);
int psrm(int, void *, void *);
unsigned long rmfmh5(s_ptr, ar)
char *s_ptr;
struct cma { /* RM fills this structure */
struct tcb *p_tcb;
struct rcb *p_rcb;
} *ar;
{
struct tcb *p_tcb;
struct tcb *temp_tcb;
struct rcb *p_rcb;
struct scb *p_scb;
struct lucb *p_lucb;
struct fmhcom *p_fmh;
struct FMH5 *p_fmh5;
struct pnlu *p_pnlu;
struct mode *p_mode;
struct rpl *p_rpl;
struct id {
char id_n[4];
unsigned long id_id;
} id_ar;
struct arcb a_rcb;
struct rcballoc rcb_a;
char *p;
unsigned long sense;
char name[8];
unsigned int code;
int i, cnt;
#if OS_TYPE == 1
/********* Trace facility **********/
unsigned int rtype; /* type of record */
unsigned int pnum; /* point number */
char pname[8]; /* name of module */
char *drec; /* record for dump */
int lenr; /* record length */
rtype = INPROC;
strcpy(pname, "rmfmh5");
pnum = 1;
drec = ar;
lenr = 10;
gtf(rtype, pname, pnum, drec, lenr);
/***********************************/
#endif
p_fmh = s_ptr;
p = p_fmh -> ru;
if ((sense = attacheck(p)) != OK) {
goto Ret;
}
/*
* Seek SCB for that LU_NAME
*/
p_lucb = psp_ini.lucb_list_ptr;
p_scb = p_fmh -> p_scb;
/*
* Allocate TCB and RCB.
*/
if (p_scb -> use != FREE) {
sense = 0x1008600b; /* parallel-session not allow !!!*/
goto Ret;
}
p_scb -> use = IN_USE;
if (p_lucb -> cur_tps == p_lucb -> max_tps) {
sense = 0x084b6031; /* Allocation_error--Trans_pgm_not_aval_retry */
goto Ret;
}
if ((p_tcb = calloc(1, sizeof(struct tcb))) == NULL) {
sense = 0x1008600b; /* SCB was not found */
goto Ret;
}
p_lucb -> cur_tps++;
if (p_lucb -> tcb_list_ptr == NULL) {
p_lucb -> tcb_list_ptr = p_tcb;
}
else
{
temp_tcb = p_lucb -> tcb_list_ptr;
while (temp_tcb -> next != NULL) {
temp_tcb = temp_tcb -> next;
}
temp_tcb -> next = p_tcb;
p_tcb -> prev = temp_tcb;
}
p_tcb -> p_lucb = p_lucb;
/* Set tcb_id */
memcpy(id_ar.id_n, "TPxx", 4);
id_ar.id_id = p_tcb;
memcpy(p_tcb -> tcb_id, &id_ar, 8);
/* Set tp_name */
p_fmh5 = p_fmh -> ru;
p = &(p_fmh5 -> tpname);
cnt = p_fmh5 -> lntpn;
memset(p_tcb -> tp_name, 0, 64);
for (i = 0; i < cnt; i++) {
p_tcb -> tp_name[i] = *(p + i);
}
/* Fill the ALLOCATE_RCB record */
memcpy(a_rcb.lu_name, p_fmh -> lu_name, 8);
a_rcb.p_tcb = p_tcb;
/*
* Seek partner_lu
*/
p_pnlu = p_lucb -> pluptr;
while (p_pnlu != NULL) {
p_mode = p_pnlu -> m_ptr;
if (memcmp(p_pnlu -> lu_name, a_rcb.lu_name, 8) == 0) {
goto here_you_are;
}
p_pnlu = p_pnlu -> next;
}
if (p_pnlu == NULL) {
sense = 0x1008600b;
goto Ret;
}
here_you_are :
memcpy(a_rcb.mode_name, p_mode -> name, 8);
/*
* the ALLOCATE_RCB record is complete.
*/
code = ALLOCATE_RCB;
psrm(code, &a_rcb, &rcb_a);
if (rcb_a.rc != OK) {
sense = 0x1008600b;
goto Ret;
}
/*
* Fill "cma" structure.
*/
ar -> p_tcb = p_tcb;
ar -> p_rcb = rcb_a.rcb_ptr;
/*
* Set pointer to RCB in SCB
*/
p_scb -> p_rcb = rcb_a.rcb_ptr;
p_rcb = rcb_a.rcb_ptr;
p_rcb -> conv_state = Rcv; /* New RCB in receive state */
p_rcb -> p_scb = p_scb; /* Link to SCB */
p_rpl = p_scb -> p_rpl;
p_rcb -> p_partner = p_pnlu; /* Pointer to Partner_LU */
p_rcb -> sess_corl = p_rpl -> arg;
/*
* Set the sense data and return
*/
sense = 0x00000000;
Ret:
return(sense);
}